package com.example.base.websocket;

import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.parameters.P;
import org.springframework.web.socket.WebSocketSession;

import java.io.IOException;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

@Slf4j
public class WsAppSessionManager {



    private static final Map<String,Map<String, SocketModel>> SOCKETMODEL_MAP=new HashMap<>();


    public static void addAppSocketModel(String appName,String userId,SocketModel socketModel){
        Map<String, SocketModel> socketModelMap = SOCKETMODEL_MAP.computeIfAbsent(appName, k -> new HashMap<>());
        socketModelMap.put(userId,socketModel);
    }

    public static SocketModel getUserIdByUserId(String appName,String userId){
        Map<String,SocketModel> socketModelMap = SOCKETMODEL_MAP.get(appName);
        if(socketModelMap==null){
            return null;
        }
        for(Map.Entry<String,SocketModel> modelEntry:socketModelMap.entrySet()){
            SocketModel socketModel=modelEntry.getValue();
            if(socketModel.getUserId().equals(userId)) {
                return modelEntry.getValue();
            }
        }
        return null;
    }

    public static SocketModel getUserIdBySessionId(String appName,String sessionId){
        Map<String,SocketModel> socketModelMap = SOCKETMODEL_MAP.get(appName);
        if(socketModelMap==null){
            return null;
        }
        for(Map.Entry<String,SocketModel> modelEntry:socketModelMap.entrySet()){
            SocketModel socketModel=modelEntry.getValue();
            if(socketModel.getWebSocketSession().getId().equals(sessionId)){
                return modelEntry.getValue();
            }
        }
        return null;
    }

    public static List<SocketModel> getSocketModelByAppName(String appName){
        Map<String,SocketModel> socketModelMap = SOCKETMODEL_MAP.get(appName);
        if(socketModelMap==null){
            return Collections.emptyList();
        }
        List<SocketModel> socketModels=new ArrayList<>(socketModelMap.values());
        return socketModels;
    }


    public static void remove(String appName,String sessionId){
        SocketModel socketModel=getUserIdBySessionId(appName,sessionId);
        if(socketModel!=null){
            Map<String,SocketModel> socketModelMap=SOCKETMODEL_MAP.get(appName);
            if(socketModelMap!=null){
                socketModelMap.remove(socketModel.getUserId());
            }
            if(socketModel.getWebSocketSession()!=null){
                try {
                    socketModel.getWebSocketSession().close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
    }


    public static String getAppName(String path){
        String[] parts = path.split("/");
        if (parts.length >= 3) {
            return parts[2];
        } else {
            return "";
        }
    }




}
